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

Concatなどを使用する必要はありません(サポートされていないことがわかりました)ので、文字列を追加するだけです

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

Entity Frameworkでは、これにより次のようなSQLが生成されます

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

最も簡単な方法は、SQL Server データベースに VIEW を作成することです。その VIEW には、Student のすべてのフィールドと連結されたフィールドが新しいフィールドとして含まれています。

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

次に、Entity Framework で、この VIEW をエンティティにマップし、そのエンティティに対してクエリを実行します。

このようにすると、データベースに連結作業を処理させるため、LINQ クエリの可読性とパフォーマンスが向上します。

于 2013-03-11T09:03:33.030 に答える