如何制作动态where子句:linq to sql

时间:2011-06-28 19:07:40

标签: asp.net vb.net linq-to-sql

我有以下linq查询:

        Dim q = From definition In definitionList _
            Where definition.ValueDefName.Contains(criteria) _
            Select definition.ValueDefName, definition.ValueDefDesc, definition.DateCreated, _
            definition.StrategicInitiative, definition.ValueWikiURL, definition.ValueDefinitionStatusID, _
            definition.Aliaslist

我已经研究过这个答案:Dynamic WHERE clause in LINQ

不幸的是,它对我使用.net 4.0不起作用。当我尝试传递条件字符串时,请求谓词。最终目标是添加以下任何一项:

  1. definition.ValueDefname.Contains(条件)
  2. definition.ValueDefDesc.Contains(条件)
  3. definition.Aliaslist.Contains(标准)
  4. definition.StrategicInitiative.Contains(标准)
  5. 根据用户选择的复选框传递到查询中。如何在linq中创建动态where子句到sql?是否有新的语法将where子句作为字符串传递?

2 个答案:

答案 0 :(得分:1)

对于LINQ to SQL,动态LINQ方法是将字符串作为Where子句传递的唯一选项。或者,Where子句采用表达式,您可以使用此方法动态构建表达式:http://msdn.microsoft.com/en-us/library/bb882637.aspx

我是使用Entity Framework完成的,我相信这也适用于LINQ to SQL。

HTH。

答案 1 :(得分:0)

不是100%确定这可以满足您的需求,但我们使用传递到搜索方法中的lambda表达式函数:

在我们的存储库类中:

public override IEnumerable<KeyCode> FindAll(Expression<Func<KeyCode, bool>> filter)
{
    return GetAll().AsQueryable().Where(filter);
}

在其他地方

KeyCodeRepository keycodeRepository = new KeyCodeRepository(unitOfWork);
IEnumerable<KeyCode> keyCodes = keycodeRepository
    .FindAll(k => k.FlowStatus.Value == (int)FlowStatusType.Active 
                                    && k.AppSystem.Id == appSystemId);

表达式

k.FlowStatus.Value == (int)FlowStatusType.Active && k.AppSystem.Id == appSystemId

作为表达式传递给FindAll方法中的Where子句。这允许我们在调用FindAll();

的任何时候动态确定我们的过滤器