Имам куп параметри, които подавам в C# метод, който използва LINQ към SQL. Всички тези параметри са филтри от потребителски интерфейс. Четири от параметрите, които трябва да филтрирам, са в същата колона в същата таблица. Например таблицата може да изглежда така:
ID | FK_ID | Name | Value
1 1 Param1 p1Val
2 1 Param2 p2Val
3 1 Param3 p3.Val
3 1 Param4 p4.Val
Трябва да взема параметрите на филтъра и да ги съпоставя с колоната Стойност и също така да се уверя, че името е правилно. В момента правя това, като се присъединявам към една и съща маса няколко пъти...но се опасявам, че това е твърде неефективно. Кой е най-добрият начин да направите това? Мисля, че бих искал да изградя заявката динамично, за да мога да проверя кои филтри са зададени, но се боря с това как да изградя своя набор от резултати. В момента изглежда така: (FYI ContextProperties е въпросната таблица)
var result =
from f in dataContext.Faults
join m in dataContext.Messages on f.FaultID equals m.FaultID
join c in dataContext.ContextProperties on m.MessageID equals c.MessageID
join cp in dataContext.ContextProperties on c.MessageID equals cp.MessageID
join cpp in dataContext.ContextProperties on cp.MessageID equals cpp.MessageID
join cppp in dataContext.ContextProperties on cpp.MessageID equals cppp.MessageID
where (f.DateTime >= initDate && f.DateTime <= finishDate) &&
f.FaultID == (faultID != Guid.Empty ? faultID : f.FaultID) &&
f.Application == (!string.IsNullOrEmpty(application) ? application : f.Application) &&
f.FaultCode == (!string.IsNullOrEmpty(faultCode) ? faultCode : f.FaultCode) &&
f.FailureCategory == (!string.IsNullOrEmpty(failureCategory) ? failureCategory : f.FailureCategory) &&
f.ErrorType == (!string.IsNullOrEmpty(errorType) ? errorType : f.ErrorType) &&
(f.FaultSeverity >= 0 && f.FaultSeverity <= maxFaultSeverity)
where (c.Value.ToString() == (!string.IsNullOrEmpty(geniusReference) ? geniusReference : c.Value.ToString())
&& c.Name.ToString() == "GeniusReference")
where (cp.Value.ToString() == (!string.IsNullOrEmpty(programNumber) ? programNumber : cp.Value.ToString())
&& cp.Name.ToString() == "ProgramGeniusNumber")
where (cpp.Value.ToString() == (!string.IsNullOrEmpty(platform) ? platform : cpp.Value.ToString())
&& cpp.Name.ToString() == "Platform")
where (cppp.Value.ToString() == (!string.IsNullOrEmpty(modifiedBy) ? modifiedBy : cppp.Value.ToString())
&& cppp.Name.ToString() == "ModifiedBy")
select new FaultsWithFilters {
DateTime = f.DateTime
,FaultID = f.FaultID
,Scope = f.Scope
,FaultCode = f.FaultCode
,FaultSeverity = f.FaultSeverity
,ErrorType = f.ErrorType
,Description = f.Description
,FaultDescription = f.FaultDescription
,FailureCategory = f.FailureCategory
,GeniusReference = c.Value.ToString()
,ProgramNumber = cp.Value.ToString()
,Platform = cpp.Value.ToString()
,ModifiedBy = cppp.Value.ToString()
};
последвано от куп изрази where и select. Благодаря предварително за помощта! PS Съжалявам за скапаното форматиране.