2010-09-08 76 views
1

Hi people
我想在关键字字段中搜索,例如集合中的搜索关键字。
例如我的关键是“翼”关键字是“翼礼服其他”与空间我应该写什么,而不是它?
错误:方法'布尔比较(System.String,System.String)'没有支持到SQL的转换。在linq语句中添加一个自定义函数

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.QueryString.HasKeys()) 
    { 
     DbDataContext db = new DbDataContext(); 
     var Query = from n in db.Products 
        where Compare(n.Keywords, Request.QueryString["key"]) 
        select n; 
     DataList1.DataSource = Query; 
     DataList1.DataBind(); 
    } 
} 

bool Compare(string keywords,string key) 
{ 
    string[] items = keywords.Split(' '); 
    foreach (string item in items) 
     if (item.Equals(key)) return true; 
    return false; 
} 
+1

不,你不能这样做,它也被问及一百万次。 – leppie 2010-09-08 07:01:18

+0

而不是?你说过一些事情是真的或错的,但这不是解决方案。 – kamiar3001 2010-09-08 07:19:50

回答

2

在这种情况下,您可以使用Contains来代替您自制的Compare,它检查字符串是否在字符串中。这也工作了LINQ

例如:

var Query = from n in db.Products 
       where n.Keywords.Contains(Request.QueryString["key"]) 
       select n; 

包含数组的作品也是如此。

+0

这是真的你能给我举个例子吗? – kamiar3001 2010-09-08 07:21:34

5

类似阙/ ANS:Custom Method in LINQ to SQL query

入住此为文章全文:What is and what isn't possible with linq

以下是不可能的

// function used in filter 
static bool MyFunc(Nwind.Product p) 
{ 
    return p.ProductName.StartsWith("B"); 
} 
// query that uses MyFunc 
var q = 
    from p in db.Products 
    where MyPriceFunc(p.UnitPrice) > 30m 
    select p 

它编译没有错误,但是当你执行它LINQ到SQL抛出一个异常说:“静态方法System.Boolean MyTest(LINQTest.Nwind.Product)没有支持转换为SQL”。

当您尝试从q获取结果(例如使用foreach语句)时,实际上会引发异常,因为LINQ to SQL只在需要结果时才会尝试将表达式树转换为T-SQL,并且查询必须被执行。

要修复该示例,您可以简单地将检查产品名称是否以“B”开头的代码复制到查询的where子句中,并且它将正常工作。

+0

你说过什么是真的或错的,但这不是解决方案。我应该用什么来代替它?代码或示例 – kamiar3001 2010-09-08 07:21:09