0

对不起标题,我只是不知道如何想出一个定义明确的标题。但无论如何,我只需要向你解释我的问题。

我做了一个查询,将查找由其全名指定的某个学生。

SQL 版本:

SELECT * FROM Student as s WHERE concat(s.lastname,', ',s.firstname,' ',s.middlename) = myvalue

我已经尝试了很多次,已经使用 string.concat 和 string.join 将其转换为 linq 查询,但它给了我一个错误:

LINQ to Entities 无法识别方法 'System.String Concat(System.Object[])' 方法,并且此方法无法转换为存储表达式。

也许有人可以帮忙。谢谢!

学生:

public class Student{
public int StudentID { get; set; }
public string Firstname { get; set; }
public string Middlename { get; set; }
public string Lastname { get; set; }
public ...
}

我的 linq 查询:

public void FindStudent(string fullname){

using(MyContext _ctx = new MyContext()){

var _query = from stud in _ctx.Student
where string.concat(stud.Lastname.Trim(),' ',stud.Firstname.Trim(),' ',stud.Middlename.Trim()) == fullname

select new{

StudentID = stud.StudentID,
Firstname = stud.Firstname,
Middlename = stud.Middlename,
Lastname = stud.Lastname

}
}
}
4

3 回答 3

1

不要为姓氏、名字和中间名传递单个字符串,而是分别传递它们:

var students = from s in db.Students
               where s.LastName == lastName &&
                     s.FirstName == firstName &&
                     s.MiddleName == middleName
               select s;

如果您只有“lastName, firstName middleName”格式的字符串,那么您可以这样解析它:

string name = "Downey, Robert Jr";
var match = Regex.Match(name, @"(?<last>\w+),\s+(?<first>\w+)\s+(?<middle>\w+)");
string lastName = match.Groups["last"].Value;
string firstName = match.Groups["first"].Value;
string middleName = match.Groups["middle"].Value;
于 2013-03-11T09:06:40.197 回答
0

最简单的方法是在 SQL Server 数据库中创建一个 VIEW。然后,该 VIEW 包含 Student 的所有字段和连接的字段作为新字段,例如 FullName:

CREATE VIEW StudentQuery
AS
SELECT *, LastName + ', ' + FirstName + ' ' + MiddleName AS FullName
FROM Student

然后在实体框架中,将此视图映射到实体,然后查询该实体。

这样,您的 LINQ 查询更具可读性和性能,因为您让数据库处理连接工作。

于 2013-03-11T09:03:33.030 回答
0

您不需要使用 Concat 等(并且您发现它们不受支持)所以只需添加字符串

var q = Students.Where(
          s => s.LastName + ", " + s.FirstName + ", " + s.MiddleName == FullName);

在实体框架中,这将产生类似于

SELECT ...
FROM [Students] AS [t0]
WHERE (([t0].[LastName] + @p0) + [t0].[FirstName] + ....) = @p3
于 2013-03-11T09:10:24.343 回答