본문 바로가기

Programing/닷넷

SQLite in LINQ

Community.CsharpSqlite.SQLiteClient는 추상클래스 System.Data.Common.DbConnection를 구현하고 있기 때문에 쉽게 LINQ사용이 가능할 것이라고 생각했다.


아래와 같은 테이블에

CREATE TABLE IF NOT EXISTS [MFPUserMap] (

    [MapID] INTEGER PRIMARY KEY AUTOINCREMENT,

    [MFPIP] varchar(50) NOT NULL,

    [UserName] nvarchar(50) NOT NULL,

    [MFPUserID] int NOT NULL,

    [CreatedDate] datetime DEFAULT (datetime('now','localtime'))

);


아래와 같은 컨텍스를 구현하는 클래스를 만들고

public partial class MyDB : DataContext

{

    public Table<MFPUserMap> MFPUserMaps;

    public MyDB(IDbConnection connection) : base(connection) { }

}

[Table(Name = "MFPUserMap")]

public class MFPUserMap

{

    [Column(IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false)]

    public int MapID;

    [Column(CanBeNull = false)]

    public string MFPIP;

    [Column(CanBeNull = false)]

    public string UserName;

    [Column(CanBeNull = false)]

    public int MFPUserID;

    [Column]

    public string CreatedDate;

}


사용하는 LINQ는

public int GetUserIDFromMfpUserMap(string mfpIP, string userName)

{

    using (DbConnection con = new SqliteConnection(_connectionStr))

    {

        con.Open();

        using (MyAuthDB db = new MyAuthDB(con))

        {

            var query =

                from m in db.MFPUserMaps

                where m.MFPIP == mfpIP

                where m.UserName == userName

                select m.MFPUserID;

            int cnt = query.Count();

            if (cnt > 0)

            {

                return query.First();

            }

            else

            {

                return 10;

            }

        }

    }

}

와 같았다. 그런데 

Community.CsharpSqlite.SQLiteClient.SqliteSyntaxException : near ".": syntax error

예외가 발생하였다.


쿼리를 확인하다 보니, TOP 1 과 같은 쿼리가 있음을 발견했다.

 (dataContext.Log = Console.Out 으로 로그를 출력 스트림에 연결 할 수 있다.)

SELECT TOP (1) [t0].[MFPUserID]

FROM [MFPUserMap] AS [t0]

WHERE ([t0].[UserName] = @p0) AND ([t0].[MFPIP] = @p1)


SQLite는 top n 대신 limit n이라는 키워드를 사용한다.

LINQ가 만능은 아닌 것이다.



참고사항

A LINQ Tutorial: Mapping Tables to Objects - CodeProject

How to: Connect to a Database (LINQ to SQL) - MSDN

 DataContext Constructor - MSDN

 Table<TEntity> Class - MSDN

Querying SQL Server databases using LINQ to SQL - ms tip