问题相结合的功能或扩展方法使用LINQ来匹配别名(Problems combining a func

2019-10-19 01:35发布

在数据库中的我需要几别名数据被用于一个ID(捕捉所有ID)和同样的情况对于这个ID需要进行比较的值。 LINQ不允许但是我使用分机或功能,通过将选择记录,或者我错在这里做一些事情。

比方说,空,“_”,“”和“默认”是用于捕捉所有ID,其中任何其他数值应被视为一个单独的值更多钞票值。

我正在寻找一种方式来产生一个选择LINQ其在清洁和维护的方式匹配aliasses。

似乎什么工作原理是:

using (DataContext context = new DataContext())
{
   var q = (from c in context.BasketContents
            where
            (c.ID+" ").Replace("Default", "").Replace("_", "") 
             == 
            (Value+" ").Replace("Default", "").Replace("_", "")
            select c);
}

或者这也适用:

where ((c.ID==null |c.ID=="Default" | c.ID=="_" | c.ID=="") & 
       (Value==null |Value=="Default" | Value=="_" | Value=="")) |
       (c.ID==Value))

这是更糟:)

由于这种比较需要相当大数量的查询来进行我想用一个扩展,或功能,所以我想结合以下几点:

    private bool IsSameID(string a1, string a2)
    {
        return ((a1 == null | a1 == "Default" | a1 == "_" | a1 == "")
        && (a2 == null | a2 == "Default" | a2 == "" | a2 == "_"))
        | (a1 == a2) ? true : false;
    }

与查询:

using (DataContext context = new DataContext())
{
   var q = (from c in context.BasketContents
            where
            IsSameID(c.ID,Value)
            select c);
}

这将引发以下异常:布尔“IsSameID(System.String,System.String)”没有支持转换为SQL

我也写了将采取替代了护理的扩展方法:

public static string DeAlias(this string a)
{
   return (a == null | a == "Default" | a == "_" | a == "") ? "" : a;
}

所以我可以比较ID.DeAlias() == Value.DeAlias()但是这基本上有同样的问题。

所以我在做什么错在这里?

Answer 1:

的LINQ to SQL无法将您的自定义的方法转换成SQL。 您应该过滤在客户端你的篮子内容:

from c in context.BasketContents.AsEnumerable()
where IsSameID(c.ID,Value)
select c

或者不使用自定义的方法

from c in context.BasketContents
where (c.ID == null || c.ID == "Default" || c.ID == "_" || c.ID == "") &&
       c.ID == Value
select c

正如我在评论中指出,你还可以创建方法,它返回类型的表达式Expression<Func<BasketContents,bool>> ,如果你想从查询中提取出复杂的过滤:

private Expression<Func<BasketContents,bool>> IsSameID(string value)
{
    return (Expression<Func<BasketContents,bool>>)(c => 
         ((c.ID == null || c.ID == "Default" || c.ID == "_" || c.ID == "") &&
          c.ID == value);              
}

在这种情况下,查询将如下所示:

context.BasketContents.Where(IsSameID("your value"));


文章来源: Problems combining a function or extension method with linq to match aliases