【问题标题】:PredicateBuilder returns all users predicate.OrPredicateBuilder 返回所有用户谓词。或者
【发布时间】:2013-11-19 02:07:31
【问题描述】:

我正在使用 C#、Entity Framework Code First 4.4.0.0 和 .NET Framework 4.0 开发一个库。

我有这个代码:

string[] keywords = null;
if (query_string != null)
    keywords = query_string.Split(' ');

// Check parameter. It will throw an exception.
ParameterCheck.CheckObjectId(user_id);

// Convert parameter to int.
int userId = Int32.Parse(user_id);

try
{
    using (var context = new AdnLineContext())
    {
        context.Configuration.ProxyCreationEnabled = false;

        //IQueryable<User> query = context.Users;
        IQueryable<User> query = context.Users.AsExpandable();
        var predicate = PredicateBuilder.False<User>();

        foreach (string keyword in keywords)
        {
            string temp = keyword;

            predicate = predicate.Or(u => u.Name.Contains(temp) ||
                                     u.State.Contains(temp) ||
                                     u.HashTags.Contains(temp));
        }
        query.Where(predicate);
        query.Include("WhoHasBlockedMe").Include("Friends");

        var users = query.ToList();

        [ ... ]
    }
}

如果keywords = {"john", "happy"}我想得到这个SQL:

select * from users where
users.name like '%john%' or 
users.state like '%john%' or 
users.hashtags like '%john%' or 
users.name like '%happy%' or 
users.state like '%happy%' or 
users.hashtags like '%happy%'; 

如何使用 PredicateBuilder 做到这一点?

对了,我已经从http://www.albahari.com/nutshell/predicatebuilder.aspx下载了LinqKit

更新
我在var users = query.ToList(); 添加了一个断点,query 有这个 SQL:

{SELECT 
[Extent1].[UserId] AS [UserId],
[...]
FROM [dbo].[Users] AS [Extent1]}

它没有Where 子句。

【问题讨论】:

  • @pasty 不,这不会改变任何事情。

标签: c# linq entity-framework predicatebuilder


【解决方案1】:

你的问题在这里:

query.Where(predicate);
query.Include("WhoHasBlockedMe").Include("Friends");

var users = query.ToList();

.Where.Include修改基础查询,它们返回一个新查询。

使用

query = query.Where(predicate);
query = query.Include("WhoHasBlockedMe").Include("Friends");

var users = query.ToList();

改为。

【讨论】:

  • ...或使用漂亮的点符号。
【解决方案2】:

true OR something Or SomethingElse 的结果是什么?

你还需要知道something 是什么吗?

永远是true

您需要从False 开始,而不是TrueFalse Or anything 等价于anything

如果您对项目进行 AND 运算,则应从 true 开始,因为 true AND anything 等同于 anything

【讨论】:

  • 是的,我从 False 开始,并将其更改为 True,因为使用 False 它会返回所有用户。
  • @VansFannel 使用true,无论如何它都会返回所有用户。使用False 它将生成正确的查询。您需要展示实际生成的 SQL,以了解它与您想要的有何不同。
  • 如果为 false 则返回所有用户。
  • @VansFannel 那么你还有一些其他的问题,除了这个。
  • 我已经用var query中的SQL语句更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多